﻿#region Opis pliku
//-----------------------------------------------------------------------------
// Particle.cs
// Autor: Jan Czarnowski
// 30.10.2012
//-----------------------------------------------------------------------------
#endregion

#region Using..

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

#endregion

namespace pogra
{
    /// <summary>
    /// Klasa reprezentująca cząsteczkę. Można z niej dziedziczyć w celu
    /// nadpisania metody Move().
    /// </summary>
    public class Particle
    {
        #region pola i właściwości

        Texture2D particleBase;
        protected Vector2 Position;
        protected double Velocity;
        protected double rotation;
        protected TimeSpan life;
        protected TimeSpan startLife;

        #endregion

        #region inicjalizacja

        /// <summary>
        /// Tworzy nowy obiekt cząsteczki
        /// </summary>
        /// <param name="particleBase">tekstura cząsteczki</param>
        /// <param name="Position">pozycja</param>
        /// <param name="Velocity">prędkość w px/sec</param>
        public Particle(Texture2D particleBase, Vector2 Position, float Velocity, float rotation, TimeSpan life)
        {
            this.particleBase = particleBase;
            this.Position = Position;
            this.Velocity = Velocity;
            this.rotation = rotation;
            this.life = life;
        }

        #endregion

        #region metody update i draw

        /// <summary>
        /// Uaktualnia dane obiektu
        /// </summary>
        /// <param name="deltat">czas, który upłynął od ostatniego update</param>
        /// <returns>zwraca true jeżeli cząsteczka wciąż żyje</returns>
        public virtual bool Update(TimeSpan deltat)
        {
            Move(deltat);

            this.life -= deltat;

            if (this.life > TimeSpan.Zero)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Rysowanie cząsteczki
        /// </summary>
        /// <param name="spriteBatch">obiekt SpriteBatch, za pomocą którego cząsteczka rysuje się</param>
        virtual public void Draw(ExtendedSpriteBatch exSpriteBatch)
        {
            float alpha = (float) (life.TotalMilliseconds / startLife.TotalMilliseconds);
            exSpriteBatch.Draw(particleBase, Position, null, Color.White * alpha,
                                0, new Vector2(particleBase.Bounds.Width / 2, particleBase.Bounds.Height / 2), 1f,
                                SpriteEffects.None, 0.05f);
        }

        #endregion

        #region metody protected

        protected virtual void Move(TimeSpan deltat)
        {
            this.Position.X += (float)(this.Velocity * deltat.TotalMilliseconds / 1000.0f * Math.Cos(rotation));
            this.Position.Y += (float)(this.Velocity * deltat.TotalMilliseconds / 1000.0f * Math.Sin(rotation));
        }

        #endregion
    }
}